iT邦幫忙

2021 iThome 鐵人賽

DAY 7
2
Software Development

系統與服務雜談系列 第 7

awk-3 運算符與函數

  • 分享至 

  • xImage
  •  

前兩篇回顧
awk - 簡介 Linux 製表好工具
awk-2 Regex搭配淺談

awk是個程式語言, 除了if else流程操作, 也有基本的運算符的支持.

# 計算a+b
awk 'BEGIN {a=1; b=3; print (a+b)}'
> 4

# 計算a%b 取糢
awk 'BEGIN {a=13; b=2; print (a%b)}'
> 1

# 透過--遞減運算; 前置遞減;
# 會把a減1, 更新回a, 再塞給b
awk 'BEGIN {a=13; b=--a; print (a, b)}'
> 12 12

# 透過--遞減運算; 後置遞減;
# 先把a塞值給b, 再把a減1, 更新回a
awk 'BEGIN {a=13; b=a--; print (a, b)}'
12 13

# 這裡動作是```a b+c```, 對awk來說空格就表示做字串拼接, 所以顯示會是1329
awk 'BEGIN {a=13; b=14; c=15;  print (a b+c)}'
> 1329

# 也是先字串拼接1314再做+15, 所以也輸出1329
awk 'BEGIN {a=13; b=14; c=15;  print (a b)+c}'
> 1329

# 先b*c後做字串拼接
awk 'BEGIN {a=1; b=2; c=3;  print (a b*c)}'
> 16

# 先字串拼接後做b*c
awk 'BEGIN {a=1; b=2; c=3;  print (a b)*c}'
> 36

# 在做b+c時, 因為b目前是字串, awk會看字串開頭是否有數字, 取出來做運算
# 這裡開頭都不是數字, 因此視為0
awk 'BEGIN {a=1; b="ithome"; c=3;  print b+c}';
awk 'BEGIN {a=1; b="ithome13"; c=3;  print b+c}';
> 3
> 3

# 在做b+c時, 因為b目前是字串, awk會看字串開頭是否有數字, 取出來做運算
# 這裡字串開頭有16, 因此視為b+c被視為13+3
awk 'BEGIN {a=1; b="13ithome"; c=3;  print b+c}'
> 16

也有支持Array的操作, 宣告方式為arrayName[index]=value

# 存取方式arrayName[index]
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; print ithome["13"]}'
> 2021

# 刪除array元素, ```delete array[index]```
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; delete ithome["12"]; print ithome["13"], ithome["12"]} '
> 2021 

# 搭配for loop, 探索並列印出array的元素
awk 'BEGIN {ithome["13"]=2021;ithome["12"]=2020; \
for (i in ithome)  \ 
print ithome[i];}'
> 2020
> 2021

# 搭配for loop, , 探索並列印出bash array的元素
# 先宣告bash array
# 透過printf+換行符號, 將之轉換成每個元素一行
ithome=("10th" "11th" "12th" "13th"); 
printf '%s\n' "${ithome[@]}" | awk  '{arr[NR]=$1;} END { \                              
pipe quote> for (i in arr) \
pipe quote> print arr[i]}'
> 12th
> 11th
> 10th
> 13th

內置函數

# 隨機返回0<=N<1的值
awk 'BEGIN {print rand()}'
> 0.696453

# 返回Epoch(1970-01-01 UTC)到目前為止的秒數
awk 'BEGIN {print systime()}'
> 1631465043

# system函數可以執行指定的系統命令
# 如果正常執行且完成, 則返回0 ; 否則返回非0
awk 'BEGIN {location=system("pwd"); print location}'
> /home/nathan
> 0

自定義函數

vim demo.awk

# find_min有兩個參數num1, num2
# 回傳最小的一個
function find_min(num1, num2)
{
    if (num1 < num2)
        return num1
    return num2
}

BEGIN {print find_min(10, 20)}
awk -f demo.awk
> 10

上一篇
awk-2 Regex搭配淺談
下一篇
awk - 4 常見處理案例
系列文
系統與服務雜談33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言